윈도우 함수로 시계열 데이터의 힘을 활용하세요. 데이터 분석을 위한 필수 개념, 실용 예제, 고급 기술을 다룹니다.
시계열 분석: 윈도우 함수 마스터하기
시계열 데이터는 순차적이고 시간에 의존적인 특성으로 특징지어지며, 모든 산업 분야에서 흔히 사용됩니다. 주가 추적 및 웹사이트 트래픽 모니터링부터 센서 판독값 분석 및 판매 추세 예측에 이르기까지, 시계열 데이터에서 의미 있는 통찰력을 추출하는 능력은 정보에 입각한 의사 결정을 위해 매우 중요합니다. 윈도우 함수는 테이블 또는 데이터 프레임의 현재 행과 관련된 일련의 행에 대해 계산을 수행할 수 있는 강력하고 유연한 도구 세트를 제공하므로 시계열 분석에 필수적입니다.
시계열 데이터 이해
시계열 데이터는 시간 순서로 인덱싱된 데이터 포인트의 시퀀스입니다. 데이터 포인트는 다음과 같은 다양한 지표를 나타낼 수 있습니다.
- 금융 데이터: 주가, 환율, 거래량
- 판매 데이터: 다양한 제품의 일별, 주별 또는 월별 판매 수치
- 센서 데이터: 온도 판독값, 압력 측정, 습도 수준
- 웹 트래픽 데이터: 웹사이트 방문, 페이지 조회수, 이탈률
- 에너지 소비 데이터: 시간별 또는 일별 전기 사용량
시계열 데이터를 분석하면 미래 값을 예측하고, 이상값을 감지하며, 비즈니스 프로세스를 최적화하는 데 사용할 수 있는 패턴, 추세 및 계절성을 식별할 수 있습니다.
윈도우 함수 소개
윈도우 함수는 윈도우 집계 또는 분석 함수라고도 하며, 전통적인 집계 함수(예: SUM, AVG, COUNT)처럼 행을 단일 결과 집합으로 그룹화하지 않고 현재 행과 관련된 일련의 행에 대해 계산을 수행할 수 있습니다. 이 기능은 이동 평균, 누적 합계 및 기타 시간 기반 메트릭을 계산해야 하는 경우가 많은 시계열 분석에 특히 유용합니다.
윈도우 함수는 일반적으로 다음 구성 요소로 구성됩니다.
- 함수: 수행할 계산(예: AVG, SUM, RANK, LAG).
- OVER 절: 계산에 사용되는 행의 윈도우를 정의합니다.
- PARTITION BY 절(선택 사항): 데이터를 파티션으로 나누며, 윈도우 함수는 각 파티션에 독립적으로 적용됩니다.
- ORDER BY 절(선택 사항): 각 파티션 내의 행 순서를 지정합니다.
- ROWS/RANGE 절(선택 사항): 계산에 사용되는 현재 행을 기준으로 하는 행 집합인 윈도우 프레임을 정의합니다.
주요 개념 및 구문
1. OVER() 절
OVER()
절은 윈도우 함수의 핵심입니다. 함수가 작동할 행의 윈도우를 정의합니다. 인수가 없는 간단한 OVER()
절은 전체 결과 집합을 윈도우로 간주합니다. 예를 들면 다음과 같습니다.
SQL 예:
SELECT
date,
sales,
AVG(sales) OVER()
FROM
sales_data;
이 쿼리는 sales_data
테이블의 모든 날짜에 대한 평균 판매량을 계산합니다.
2. PARTITION BY
PARTITION BY
절은 데이터를 파티션으로 나누며, 윈도우 함수는 각 파티션에 별도로 적용됩니다. 데이터 내의 서로 다른 그룹에 대한 메트릭을 계산하려는 경우 유용합니다.
SQL 예:
SELECT
date,
product_id,
sales,
AVG(sales) OVER (PARTITION BY product_id)
FROM
sales_data;
이 쿼리는 각 제품의 평균 판매량을 별도로 계산합니다.
3. ORDER BY
ORDER BY
절은 각 파티션 내의 행 순서를 지정합니다. 이는 실행 합계, 이동 평균 및 기타 시간 기반 메트릭을 계산하는 데 필수적입니다.
SQL 예:
SELECT
date,
sales,
SUM(sales) OVER (ORDER BY date)
FROM
sales_data;
이 쿼리는 시간에 따른 판매량의 누적 합계를 계산합니다.
4. ROWS/RANGE
ROWS
및 RANGE
절은 계산에 사용되는 현재 행을 기준으로 하는 행 집합인 윈도우 프레임을 정의합니다. ROWS
절은 실제 행 번호를 기준으로 윈도우 프레임을 지정하고, RANGE
절은 ORDER BY
열의 값을 기준으로 윈도우 프레임을 지정합니다.
ROWS 예:
SELECT
date,
sales,
AVG(sales) OVER (ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
FROM
sales_data;
이 쿼리는 지난 3일 동안(현재 날짜 포함)의 이동 평균 판매량을 계산합니다.
RANGE 예:
SELECT
date,
sales,
AVG(sales) OVER (ORDER BY date RANGE BETWEEN INTERVAL '2' DAY PRECEDING AND CURRENT ROW)
FROM
sales_data;
이 쿼리는 지난 2일 동안(현재 날짜 포함)의 이동 평균 판매량을 계산합니다. RANGE
에는 숫자 또는 날짜/시간 데이터 유형의 정렬된 열이 필요합니다.
시계열 분석을 위한 일반적인 윈도우 함수
1. 롤링/이동 평균
이동 평균이라고도 하는 롤링 평균은 시계열 데이터의 단기적 변동을 완화하고 장기적인 추세를 강조하기 위해 널리 사용되는 기법입니다. 지정된 시간 윈도우에 걸쳐 값을 평균하여 계산됩니다.
SQL 예:
SELECT
date,
sales,
AVG(sales) OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS moving_average_7_days
FROM
sales_data;
이 쿼리는 7일 이동 평균 판매량을 계산합니다.
Python 예제(Pandas 사용):
import pandas as pd
# 'date' 및 'sales' 열이 있는 'sales_df'라는 Pandas DataFrame이 있다고 가정
sales_df['moving_average_7_days'] = sales_df['sales'].rolling(window=7).mean()
글로벌 애플리케이션 예제: 다국적 소매업체는 30일 이동 평균을 사용하여 일별 판매량 변동을 완화하고 다양한 지역의 기본 판매 추세를 식별할 수 있습니다.
2. 누적 합계
누적 합계는 현재 행까지의 값의 합계를 계산합니다. 시간 경과에 따른 총 누적 값을 추적하는 데 유용합니다.
SQL 예:
SELECT
date,
sales,
SUM(sales) OVER (ORDER BY date) AS cumulative_sales
FROM
sales_data;
이 쿼리는 시간에 따른 판매량의 누적 합계를 계산합니다.
Python 예제(Pandas 사용):
import pandas as pd
# 'date' 및 'sales' 열이 있는 'sales_df'라는 Pandas DataFrame이 있다고 가정
sales_df['cumulative_sales'] = sales_df['sales'].cumsum()
글로벌 애플리케이션 예제: 국제 전자상거래 회사는 누적 판매량을 사용하여 다양한 시장에서 신제품 출시로 발생한 총 수익을 추적할 수 있습니다.
3. 리드 및 래그
LEAD
및 LAG
함수를 사용하면 각각 후속 행 또는 선행 행의 데이터에 액세스할 수 있습니다. 이는 기간 간 변경 사항을 계산하고, 추세를 식별하며, 서로 다른 기간의 값을 비교하는 데 유용합니다.
SQL 예:
SELECT
date,
sales,
LAG(sales, 1, 0) OVER (ORDER BY date) AS previous_day_sales,
sales - LAG(sales, 1, 0) OVER (ORDER BY date) AS sales_difference
FROM
sales_data;
이 쿼리는 전날 대비 판매량의 차이를 계산합니다. LAG(sales, 1, 0)
함수는 이전 행(오프셋 1)의 판매 값을 검색하고 이전 행이 없는 경우(예: 첫 번째 행) 0(기본값)을 반환합니다.
Python 예제(Pandas 사용):
import pandas as pd
# 'date' 및 'sales' 열이 있는 'sales_df'라는 Pandas DataFrame이 있다고 가정
sales_df['previous_day_sales'] = sales_df['sales'].shift(1)
sales_df['sales_difference'] = sales_df['sales'] - sales_df['previous_day_sales'].fillna(0)
글로벌 애플리케이션 예제: 글로벌 항공사는 리드 및 래그 함수를 사용하여 서로 다른 주에 동일한 노선의 티켓 판매량을 비교하고 잠재적인 수요 변동을 식별할 수 있습니다.
4. 순위 및 밀집 순위
RANK()
및 DENSE_RANK()
함수는 지정된 순서를 기준으로 파티션 내 각 행에 순위를 할당합니다. RANK()
는 갭이 있는 순위를 할당하고(예: 1, 2, 2, 4), DENSE_RANK()
는 갭이 없는 순위를 할당합니다(예: 1, 2, 2, 3).
SQL 예:
SELECT
date,
sales,
RANK() OVER (ORDER BY sales DESC) AS sales_rank,
DENSE_RANK() OVER (ORDER BY sales DESC) AS sales_dense_rank
FROM
sales_data;
이 쿼리는 판매 값을 내림차순으로 순위를 매깁니다.
글로벌 애플리케이션 예제: 글로벌 온라인 마켓플레이스는 순위 함수를 사용하여 각 국가 또는 지역에서 가장 많이 팔린 제품을 식별할 수 있습니다.
고급 기술 및 애플리케이션
1. 윈도우 함수 결합
더 복잡한 계산을 수행하기 위해 윈도우 함수를 결합할 수 있습니다. 예를 들어 누적 합계의 이동 평균을 계산할 수 있습니다.
SQL 예:
SELECT
date,
sales,
AVG(cumulative_sales) OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS moving_average_cumulative_sales
FROM
(
SELECT
date,
sales,
SUM(sales) OVER (ORDER BY date) AS cumulative_sales
FROM
sales_data
) AS subquery;
2. 조건부 집계와 함께 윈도우 함수 사용
특정 조건을 기반으로 계산을 수행하기 위해 조건부 집계(예: CASE
문 사용)와 함께 윈도우 함수를 사용할 수 있습니다.
SQL 예:
SELECT
date,
sales,
AVG(CASE WHEN sales > 100 THEN sales ELSE NULL END) OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS moving_average_high_sales
FROM
sales_data;
이 쿼리는 판매량이 100보다 큰 날짜에 대해서만 이동 평균 판매량을 계산합니다.
3. 시계열 분해
윈도우 함수는 시계열을 추세, 계절성 및 잔차 구성 요소로 분해하는 데 사용할 수 있습니다. 여기에는 이동 평균을 계산하여 추세를 추정하고, 계절성 패턴을 식별한 다음, 추세 및 계절성 구성 요소를 빼서 잔차를 구하는 작업이 포함됩니다.
4. 이상 감지
윈도우 함수는 이동 평균 및 표준 편차를 계산하여 시계열 데이터에서 이상값을 감지하는 데 사용할 수 있습니다. 특정 범위(예: 이동 평균에서 +/- 3 표준 편차)를 벗어나는 데이터 포인트는 이상값으로 플래그가 지정될 수 있습니다.
산업 전반의 실용적인 예
1. 금융
- 주가 분석: 주가의 이동 평균을 계산하여 추세와 잠재적인 매수/매도 신호를 식별합니다.
- 위험 관리: 포트폴리오 수익률의 롤링 표준 편차를 계산하여 변동성 및 위험을 평가합니다.
- 사기 감지: 현재 거래 금액을 과거 평균과 비교하여 비정상적인 거래 패턴을 식별합니다.
2. 소매
- 판매 예측: 이동 평균 및 누적 판매 데이터를 사용하여 미래 판매 추세를 예측합니다.
- 재고 관리: 과거 판매 데이터를 분석하고 계절성 패턴을 식별하여 재고 수준을 최적화합니다.
- 고객 세분화: 시간에 따른 구매 행동을 기반으로 고객을 세분화합니다.
3. 제조
- 예측 유지 관리: 장비의 센서 데이터를 사용하여 잠재적인 고장을 예측하고 유지 관리를 사전에 예약합니다.
- 품질 관리: 생산 공정을 모니터링하고 예상 성능에서 벗어나는 사항을 식별합니다.
- 프로세스 최적화: 생산 데이터를 분석하여 병목 현상을 식별하고 제조 공정을 최적화합니다.
4. 의료
- 환자 모니터링: 시간에 따른 환자 활력 징후를 모니터링하고 건강 문제를 나타낼 수 있는 이상값을 감지합니다.
- 질병 발생 감지: 질병의 확산을 추적하고 잠재적인 발생을 식별합니다.
- 의료 자원 할당: 환자 요구 사항 및 과거 수요 패턴을 기반으로 자원을 할당합니다.
올바른 도구 선택
윈도우 함수는 다음을 포함하여 다양한 데이터 처리 도구 및 프로그래밍 언어에서 사용할 수 있습니다.
- SQL: 대부분의 최신 관계형 데이터베이스 관리 시스템(RDBMS)은 PostgreSQL, MySQL(버전 8.0 이상), SQL Server, Oracle 및 Amazon Redshift를 포함하여 윈도우 함수를 지원합니다.
- Python: Pandas 라이브러리는
rolling()
및expanding()
메서드를 통해 윈도우 함수를 훌륭하게 지원합니다. - Spark: Apache Spark의 SQL 및 DataFrame API도 윈도우 함수를 지원합니다.
도구 선택은 특정 요구 사항과 기술 전문 지식에 따라 다릅니다. SQL은 관계형 데이터베이스에 저장된 데이터에 적합하며, Python 및 Spark는 대규모 데이터 세트를 처리하고 복잡한 분석을 수행하는 데 더 유연합니다.
모범 사례
- 데이터 이해: 윈도우 함수를 적용하기 전에 빈도, 계절성 및 잠재적인 이상값을 포함하여 시계열 데이터의 특성을 완전히 이해합니다.
- 적절한 윈도우 크기 선택: 윈도우 크기 선택은 수행 중인 특정 분석에 따라 다릅니다. 작은 윈도우 크기는 단기적 변동에 더 민감하고, 큰 윈도우 크기는 데이터를 완화하고 장기적인 추세를 강조합니다.
- 엣지 케이스 고려: 누락된 데이터 또는 시계열의 시작과 끝과 같은 엣지 케이스를 윈도우 함수가 처리하는 방식을 알고 있습니다. 이러한 케이스를 처리하려면 적절한 기본값 또는 필터링 기술을 사용합니다.
- 성능 최적화: 윈도우 함수는 특히 대규모 데이터 세트의 경우 계산 비용이 많이 들 수 있습니다. 적절한 인덱스 및 파티셔닝 전략을 사용하는 등 쿼리 및 코드를 최적화하여 성능을 향상시킵니다.
- 코드 문서화: 윈도우 함수의 목적과 논리를 설명하기 위해 코드와 쿼리를 명확하게 문서화합니다. 이렇게 하면 다른 사람들이 코드를 이해하고 유지 관리하는 것이 더 쉬워집니다.
결론
윈도우 함수는 시계열 분석을 위한 강력한 도구로, 이동 평균, 누적 합계, 리드/래그 값 및 기타 시간 기반 메트릭을 계산할 수 있습니다. 윈도우 함수를 마스터하면 시계열 데이터에서 귀중한 통찰력을 얻고 보다 정보에 입각한 의사 결정을 내릴 수 있습니다. 금융 데이터, 판매 데이터, 센서 데이터 또는 웹 트래픽 데이터를 분석하는 경우에도 윈도우 함수는 전통적인 집계 기술을 사용하여 감지하기 어려운 패턴, 추세 및 이상값을 식별하는 데 도움이 될 수 있습니다. 윈도우 함수의 주요 개념과 구문을 이해하고 모범 사례를 따르면 다양한 산업에서 광범위한 실제 문제를 효과적으로 해결하기 위해 윈도우 함수를 활용할 수 있습니다.